package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.model.Endereco;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * Classe EnderecoDAO, extende a classe DAOGenerico para obeter recursos de
 * conexão e excução de consultas e comandos.
 *
 * Responsável por gerenciar acesso ao banco de dados relacionados a Entidade
 * Endereco.
 *
 * @author Daniel
 *
 */
public class EnderecoDAO extends DAOGenerico {

    /**
     * Método para inserir um endereco.
     *
     * @param endereco Objeto endereco a ser inserido.
     * @return boolean indica se o método foi executado com sucesso.
     *
     *
     */
    public boolean inserir(Endereco endereco) {

        endereco.setId(getNextId("enderecos"));

        return executarComando("INSERT INTO enderecos (id, logradouro, numero, bairro, municipio_id) "
                             + "VALUES (?,?,?,?,?)"
                             , endereco.getId(), endereco.getLogradouro()
                             , endereco.getNumero(), endereco.getBairro()
                             , endereco.getMunicipio().getId());

    }

    /**
     * Método para atualizar informações de um endereco.
     *
     * @param endereco Objeto endereco a ser atualizado.
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean atualizar(Endereco endereco) {

        return executarComando("UPDATE enderecos SET logradouro = ?, numero = ?, "
                + "bairro = ?, municipio_id = ? WHERE id = ?"
                , endereco.getLogradouro(), endereco.getNumero(), endereco.getBairro()
                , endereco.getMunicipio().getId(), endereco.getId());

    }

    /**
     * Método para excluir um endereco.
     *
     * @param endereco Objeto endereco a ser excluído.
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean excluir(Endereco endereco) {

        return executarComando("DELETE FROM enderecos WHERE id = ?", endereco.getId());

    }

    /**
     * Método para excluir um endereco.
     *
     * @param id ID do objeto a ser excluído
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean excluir(int id) {

        return executarComando("DELETE FROM enderecos WHERE id = ?", id);

    }

    /**
     * Método para buscar o endereco pelo ID
     *
     * @return Endereco correspondente ai ID, se não for encontrado retorna
     * null.
     *
     * @param id inteiro que representa o ID do endereco na tabela
     *
     *
     */
    public Endereco getById(int id) {

        ResultSet rs = executarConsulta("SELECT * FROM enderecos WHERE id = ?", id);

        Endereco endereco = null;

        try {

             //DAO nencessário
            MunicipioDAO municipioDAO = new MunicipioDAO();

            if (rs.next()) {

                endereco = polularInformacoes(rs, municipioDAO);

            }

        } catch (SQLException ex) {

            System.err.println("ERRO AO BUSCAR ENDERECO POR ID");

        } finally {

            try {

                rs.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return endereco;

    }

    /**
     * Método para listagem de enderecos.
     *
     * @return Retorna uma lista de enderecos com o resultado da consulta
     *
     *
     */
    public List<Endereco> listar() {

        List<Endereco> enderecos = new ArrayList<>();

        ResultSet rs = executarConsulta("SELECT * FROM enderecos");

        try {

            //DAO nencessário
            MunicipioDAO municipioDAO = new MunicipioDAO();

            while (rs.next()) {

                enderecos.add(polularInformacoes(rs, municipioDAO));

            }

        } catch (SQLException ex) {

            System.err.println("ERRO AO PERCORER RESULT_SET");

        } finally {

            try {

                rs.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return enderecos;

    }

    /**
     * Método para preencher informações de um endereco com resultados do banco
     * de dados.
     *
     * @param rs ResultSet com o resultado de uma consulta SQL
     *
     * @param municipioDAO DAO de Municipio
     *
     * @return Retorna um endereco populado com informações vindas do banco de
     * dados
     *
     *
     */
    public Endereco polularInformacoes(ResultSet rs, MunicipioDAO municipioDAO) {

        Endereco endereco = new Endereco();

        try {

            endereco.setId(rs.getInt("id"));
            endereco.setLogradouro(rs.getString("logradouro"));
            endereco.setNumero(rs.getString("numero"));
            endereco.setBairro(rs.getString("bairro"));
            endereco.setMunicipio(municipioDAO.getById(rs.getInt("municipio_id")));

        } catch (SQLException ex) {

            System.err.println("ERRO AO PULULAR ENDERECO");

        }

        return endereco;

    }
}
